Ext.define('AiW.view.ya.lib.YaForm', {
    extend: 'Ext.form.Panel',
    alias: 'widget.YaForm',
    
    region: 'north',
    
    initComponent: function() {
        this.split = true;
        this.collapsible = true;
        this.titleCollapse = true;
        this.autoScroll = true;
        this.bodyPadding = 10;
        this.bodyStyle = 'background-color:#EEE';
        
        this.callParent();
    },
    
    defaults:{
        border: false,
        frame: false,
        bodyStyle:'background-color:#EEE;',

        enableKeyEvents: true,

        listeners: {
            keyup: function(a, b) {
                //Se pressionado o enter, executa a chamada do submit
                if (b.getKey() === b.ENTER) {
                    this.up('YaForm').doSubmit(
                        this.up('YaForm').actionURL,
                        SALVAR_LIMPAR
                    );
                }
            }
        }
    },
    
    tools: [
        {
            xtype: 'tool',
            type: 'help',
            qtip: 'Ajuda',
            handler: function() {
                alert('Clicou no ajuda');
            }
        },
        {
            xtype: 'tool',
            type: 'maximize',
            qtip: 'Usar modo janela',
            handler: function() {
                alert('Clicou no maximizar');
            }
        },
        {
            xtype: 'tool',
            type: 'close',
            qtip: 'Fechar',
            handler: function() {
                this.up('YaPanel').close();
            }
        }
    ],

    dockedItems: [
        {
            xtype: 'toolbar',
            dock: 'bottom',
            items: [
                {
                    xtype: 'button',
                    iconCls: 'excluir',
                    itemId: 'btnExcluir',
                    text: 'Excluir',
                    disabled: true,
                    tooltip: 'Excluir o registro',
                    handler: function() {
                        Ext.MessageBox.confirm(appTitulo,
                            'Deseja excluir este registro?',
                            this.up('YaForm').excluir,
                            this);//scope
                    }
                },
                '-',
                {
                    xtype: 'button',
                    iconCls: 'search',
                    text: 'Pesquisar',
                    tooltip: 'Pesquisar',
                    handler: function() {
                        this.up('YaForm').doPesquisar(
                            this.up('YaForm').actionURL
                        );
                    }
                },
                '-',
                {
                    xtype: 'button',
                    iconCls: 'limpar',
                    text: 'Limpar',
                    tooltip: 'Limpar o formulário',
                    handler: function() {
                        this.up('YaForm').limpar();
                    }
                },
                '-',
                {
                    xtype: 'button',
                    iconCls: 'salvarComo',
                    itemId: 'btnSalvarComo',
                    text: 'Salvar como...',
                    disabled: true,
                    tooltip: 'Salvar as alterações como um novo registro',
                    handler: function() {
                        this.up('YaForm').doSubmit(
                            this.up('YaForm').actionURL,
                            SALVAR_COMO
                        );
                    }
                },
                '-',
                {
                    xtype: 'button',
                    iconCls: 'salvar',
                    tooltip: 'Salvar as alterações',
                    text: 'Salvar',
                    handler: function() {
                        this.up('YaForm').doSubmit(
                            this.up('YaForm').actionURL,
                            SALVAR
                        );
                    }
                },
                '-',
                {
                    xtype: 'button',
                    iconCls:'salvarLimpar',
                    tooltip: 'Salvar as alterações e Limpar',
                    text: 'Salvar e Limpar',
                    handler: function() {
                        this.up('YaForm').doSubmit(
                            this.up('YaForm').actionURL,
                            SALVAR_LIMPAR
                        );
                    }
                }
            ]
        }
    ],

    loadGrid: function(grid) {
        if(!grid) {
            grid = this.up('YaPanel').down('YaGrid');
        }

        //Realizando a consulta.
        grid.down('pagingtoolbar').moveFirst();
    },

    excluir: function(btn) {
        if(btn == 'yes') {
            this.up('YaForm').doSubmit(
                this.up('YaForm').actionURL,
                EXCLUIR
            );
        }
    },

    limpar: function() {
        var frm = this.getForm();
        frm.reset();
        frm.getFields().getAt(1).focus();
        var grid = this.up('YaPanel').down('YaGrid');
        var tmpProxy = grid.getStore().getProxy();
        var x = 0;
        while(frm.getFields().getAt(x)) {
            tmpProxy.setExtraParam(frm.getFields().getAt(x++).name, '');
        }
        this.down('#btnExcluir').setDisabled(true);
        this.down('#btnSalvarComo').setDisabled(true);
        this.loadGrid();
    },

    doPesquisar: function(actionURL) {
        var frm = this.getForm();
        var grid = this.up('YaPanel').down('YaGrid');
        var x = 0;
        var tmpProxy = grid.getStore().getProxy();
        while(frm.getFields().getAt(x)) {
            tmpProxy.setExtraParam(frm.getFields().getAt(x).name, '');
            if(frm.getFields().getAt(x).name != 'id' && frm.getFields().getAt(x).name != 'update_date') {
                if(frm.getFields().getAt(x).value) {
                    tmpProxy.setExtraParam(frm.getFields().getAt(x).name, frm.getFields().getAt(x).value);
                }
            }
            x++;
        }
        this.loadGrid(grid);
    },

    doSubmit: function(actionUrl, actionExecute) {
        var _m = this;
        var frm = _m.getForm();
        var grid = _m.up('YaPanel').down('YaGrid');
        var btnExcluir = _m.down('#btnExcluir');
        var btnSalvarComo = _m.down('#btnSalvarComo');

        if(!frm.isValid()) {
            Ext.Msg.alert(appTitulo, 'Por favor, verifique os problemas do formulário.');
            return false;
        }

        frm.submit({
            url: (actionUrl + '/' + actionExecute),
            method: 'post',
            waitTitle: appTitulo,
            waitMsg: 'Processando...',
            success: function(t, resp, opts) {
                var obj = Ext.decode(resp.response.responseText);
                if(SUCESSO == obj.success) {
                    if(SALVAR_LIMPAR == actionExecute || EXCLUIR == actionExecute) {
                        frm.reset();
                        frm.getFields().getAt(1).focus();
                        btnExcluir.setDisabled(true);
                        btnSalvarComo.setDisabled(true);
                        _m.loadGrid();
                    } else if(SALVAR == actionExecute || SALVAR_COMO == actionExecute) {
                        frm.setValues(obj.data);
                        btnExcluir.setDisabled(false);
                        btnSalvarComo.setDisabled(false);
                        _m.loadGrid();
                    } else if(PESQUISAR == actionExecute) {
                        btnExcluir.setDisabled(true);
                        btnSalvarComo.setDisabled(true);
                    }
                    exibirMsgTopo(appTitulo, 'Ação executada com sucesso !');
                } else {//Qualquer Erro
                    _m.tratarErro(resp);
                }
            },//Erro no servidor, header 500
            failure: function(t, resp, opts) {
                _m.tratarErro(resp);
            }
        })
    },

    tratarErro: function(resp) {
        var frm = this.getForm();
        var obj = Ext.decode(resp.response.responseText);
        if(obj.success == 3) { //Falha de validação, varios erros
            var msgErro = '';
            for(var i = 0; i < obj.errors.length; i++) {
                for (var chave in obj.errors[i]){
                    msgErro += obj.errors[i][chave] + '<br />';
                }
            }
            Ext.Msg.alert(appTitulo + ' - Erro', msgErro);
        } else { // Erro genérico
            Ext.Msg.alert(obj.errors.title, obj.errors.errormsg);
        }
    }

});
